home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 4 / CU Amiga Magazine's Super CD-ROM 04 (1996)(EMAP Images)(GB)(Track 1 of 3)[!][issue 1996-11].iso / magazine / psion / utils / dirdir11.lzx / dirdir.opl next >
Text File  |  1991-05-06  |  12KB  |  413 lines

  1. proc start:
  2. rem Dirdir: list filenames, filesize, date, time & attributes
  3. rem
  4. rem This program is PUBLIC DOMAIN.
  5. rem You may use this source code for whatever you like.
  6. rem Disclaimer: Use this program at your own risk.
  7. rem 
  8. rem Compuserve: Rolf Aeschbacher [100116,3357]
  9. rem E-Mail: 100116.3357@compuserve.com
  10. rem
  11. rem Use CTRL-S (Strg-S on German machines) to pause the output.
  12. rem
  13. rem Examples:
  14. rem - get all spreadsheet files: enter .spr at 'Match string'
  15. rem - contents of the WRD directory: enter \wrd\ at 'Match string'
  16. rem - get all read only files: match attributes, set 'Read Only' to yes,
  17. rem   the other three lines to 'Ignore'
  18. rem
  19. rem If you need a sorted list, select 'output to file',
  20. rem load that file into Word, select all lines, open a new spreadsheet,
  21. rem and use 'bring' to import the selected text.
  22. rem Then select the lines in the spreadsheet and use Sort to sort the lines.
  23. rem You can sort by filename, size, time, date and attributes.
  24. rem Sorting in the spreadsheet needs much RAM: With 220 KB free I was able
  25. rem to sort just over 300 filenames.
  26. rem Note: in the spreadsheet the backslash \ must not be at the beginning of
  27. rem a line because that would repeat the string to fill the field.
  28. rem
  29. global d$(128),outp%,outf$(100),srch%,search$(2,20),srch$(2,20),replm%
  30. global ver%,at%,size&,md&,sp&,dname$(128) :rem for finfo, do not change!
  31. global drive$(4,5), drive%,e%,ver$(6),at$(4),at%(4)
  32. global msize%,dsize1&,dsize2&,mdate%,ddat1&,ddat2&,disp%,mask$(16)
  33. global mtime%,dtime1&,dtime2&,mat%,disset%
  34. global j%,mo%,t%,std%,min%,sek%,tag%,all%
  35. ver$="1.1" :rem 23-Jan-1995
  36. giprint "Dirdir by Rolf Aeschbacher"
  37. trap cache 2000,7000 :rem speeds up the program but needs more RAM
  38. rem
  39. rem ***** defaults, may be changed *****
  40. disset%=2 :rem 1=full info, 2=no attributes
  41. ddat1&=days(day,month,year)
  42. ddat2&=ddat1&
  43. outf$="\wrd\dirdir.wrd" :rem for output to file
  44. srch$(1)="loc::m:\\"    :rem search for
  45. srch$(2)="'\\"          :rem replace by
  46. mask$=""                :rem default is no masking of filepaths
  47. drive%=2 :rem default drive is M
  48. rem **********
  49. rem
  50. drive$(1)="A" :drive$(2)="M" :drive$(3)="B" :drive$(4)="All"
  51. do
  52.     dirdir:
  53. until 0
  54. endp
  55.  
  56. proc dirdir:
  57. local di$(100,128) :rem the 1st number is the max number of directories
  58. local r%,z%,zz%,p%,n%,e$(50),noyes$(6),space%,h%
  59. local sz&,fcount%,dd&,dats$(128),times$(20),t&,dates$(23)
  60. noyes$="No,Yes"
  61. z%=0 :rem number of dirs
  62. zz%=0 :rem total dirs
  63. p%=0 :rem pointer to di$()
  64. sz&=0 :rem cumulative filesize
  65. dinit "Dirdir v"+ver$+"  Options"
  66. dchoice drive%,"Scan Drive:",drive$(1)+","+drive$(2)+","+drive$(3)+","+drive$(4)
  67. dedit mask$,"Match string:"
  68. dchoice msize%,"Match a filesize?",noyes$
  69. dchoice mtime%,"Match a time?",noyes$
  70. dchoice mdate%,"Match a date?",noyes$
  71. dchoice mat%,"Match attributes?",noyes$
  72. dchoice srch%,"Search & Replace?",noyes$
  73. dchoice disp%,"Files:","Show & Count,Count only"
  74. r%=dialog
  75. if r%=0 :stop :endif
  76. if drive%=4 :all%=1 :drive%=1 :else all%=0 :endif
  77. if mdate%=2 or msize%=2 or mtime%=2
  78.     dinit "Match"
  79.     if msize%=2
  80.         dlong dsize1&,"Size from",0,9999999
  81.         dlong dsize2&,"Size to",0,9999999
  82.     endif
  83.     if mtime%=2
  84.         dtime dtime1&,"From time",1,0,86399
  85.         dtime dtime2&,"To time",1,0,86399
  86.     endif
  87.     if mdate%=2
  88.         ddate ddat1&,"From date",25567,50403
  89.         ddate ddat2&,"To date",25567,50403
  90.     endif
  91.     if dialog
  92.         if ddat1&>ddat2& :dd&=ddat1& :ddat1&=ddat2& :ddat2&=dd& :endif
  93.         if dsize1&>dsize2& :dd&=dsize1& :dsize1&=dsize2& :dsize2&=dd& :endif
  94.         if dtime1&>dtime2& :dd&=dtime1& :dtime1&=dtime2& :dtime2&=dd& :endif
  95.     else
  96.         mdate%=1 :msize%=1 :mtime%=1 
  97.     endif
  98. endif
  99. if mat%=2
  100.     dinit "Match file attributes"
  101.     dchoice at%(1),"Read Only",noyes$+",Ignore"
  102.     dchoice at%(2),"Modified",noyes$+",Ignore"
  103.     dchoice at%(3),"Hidden",noyes$+",Ignore"
  104.     dchoice at%(4),"System",noyes$+",Ignore"
  105.     if dialog :else mat%=1 :endif
  106.     at$=""
  107.     if mat%=2
  108.         if at%(1)=2 :at$="R" :else at$="." :endif
  109.         if at%(2)=2 :at$=at$+"M" :else at$=at$+"." :endif
  110.         if at%(3)=2 :at$=at$+"H" :else at$=at$+"." :endif
  111.         if at%(4)=2 :at$=at$+"S" :else at$=at$+"." :endif
  112.     endif
  113. endif
  114. if disp%=2 and (outp%>1 or srch%=2) :outp%=1 :srch%=1 :endif
  115. if srch%=2
  116.     dinit "Search & Replace in filenames"
  117.     dtext "","\09  Hex value of character (09=Tab)"
  118.     dtext "","\\   Search for a backslash"
  119.     dedit srch$(1),"Search for:"
  120.     dedit srch$(2),"Replace by:"
  121.     dchoice replm%,"Many replaces?",noyes$ :rem replace all occurrences or only the first in each filepath
  122.     r%=dialog
  123.     if r%=0
  124.         srch%=1 :rem cancel, no search & replace
  125.     else
  126.         prepare:
  127.     endif
  128. endif
  129. if disp%=1
  130.     dinit
  131.     dchoice disset%,"Output format:","Full,no attributes"
  132.     dchoice outp%,"Output to:","Screen,Printer,File"
  133.     if dialog :else stop :endif
  134.     if disset%=1 :space%=1 :else space%=1 :endif :rem always 1
  135. endif
  136. if outp%=2
  137.     trap lopen "PAR:A"
  138.     if err
  139.         e$=""
  140.         if err=-41 :e$="(Printer not connected)" :endif
  141.         e%=alert(err$(err),e$)
  142.         outp%=1 :rem output on screen only
  143.     endif
  144. elseif outp%=3
  145.     trap lopen outf$
  146.     if err
  147.         e$=""
  148.         e%=alert(err$(err),e$)
  149.         outp%=1 :rem output on screen only
  150.     endif
  151. endif
  152. mask$=upper$(mask$)
  153. screen 60,17,1,1
  154. cls
  155. n%=1
  156. if all%=0
  157.     print "Searching drive ";drive$(drive%) :n%=n%+1
  158. else
  159.     print "Searching all drives" :n%=n%+1
  160. endif
  161. if mask$>"" :print "Match string: ";mask$ : n%=n%+1 :endif
  162. if msize%=2 :print "Match filesize: ";dsize1&;" - ";dsize2& : n%=n%+1 :endif
  163. if mtime%=2
  164.     dd&=dtime1& :t&=dd&/3600 :dd&=dd&-t&*3600
  165.     times$=right$("0"+gen$(t&,2),2) :t&=dd&/60 :dd&=dd&-t&*60
  166.     times$=times$+":"+right$("0"+gen$(t&,2),2)+":"+right$("0"+gen$(dd&,2),2)
  167.     dd&=dtime2& :t&=dd&/3600 :dd&=dd&-t&*3600
  168.     times$=times$+" - "+right$("0"+gen$(t&,2),2) :t&=dd&/60 :dd&=dd&-t&*60
  169.     times$=times$+":"+right$("0"+gen$(t&,2),2)+":"+right$("0"+gen$(dd&,2),2)
  170.     print "Match time: ";times$ :n%=n%+1
  171. endif
  172. if mdate%=2
  173.     dates$=datecnv$:(ddat1&,ddat2&)
  174.     print "Match date: ";dates$ : n%=n%+1
  175. endif
  176. if mat%=2   :print "Match attributes: ";at$ :n%=n%+1 :endif
  177. if outp%>1
  178.     if all%=0
  179.         lprint "Searching drive ";drive$(drive%)
  180.     else
  181.         print "Searching all drives"
  182.     endif
  183.     if mask$>"" :lprint "Match string: ";mask$ :endif
  184.     if msize%=2 :lprint "Match filesize: ";dsize1&;" - ";dsize2& :endif
  185.     if mtime%=2 :lprint "Match time: ";times$ :endif
  186.     if mdate%=2 :lprint "Match date: ";dates$ :endif
  187.     if mat%=2   :lprint "Match attributes: ";at$ :endif
  188. endif
  189. screen 60,18-n%,1,n% :cls
  190. :
  191. zz%=1
  192. loop::
  193. z%=1 :p%=1
  194. di$(z%)=drive$(drive%)+":\"
  195. r%=ioopen(h%,di$(z%)+"dummy",$0)
  196. if r%=-62
  197.     print "- Drive "+drive$(drive%)+" not ready"
  198. else
  199.     if all%=0
  200.         busy "scanning",3
  201.     else
  202.         busy "scanning "+drive$(drive%),3
  203.     endif
  204.     while p%<=z%
  205.         d$=DIR$(di$(p%)) :p%=p%+1
  206.         WHILE d$<>""
  207.             dname$=d$+chr$(0)
  208.             call($887,addr(dname$)+1,addr(ver%),0,0,0)
  209.             if (at% and 16)=0
  210.                 secstodate md&,j%,mo%,t%,std%,min%,sek%,tag%
  211.                 dd&=days(t%,mo%,j%)
  212.                 at$=""
  213.                 if mat%=2 or disset%=1
  214.                     if (at% and $1)=0 :at$="R" :else at$="." :endif
  215.                     if (at% and $20)  :at$=at$+"M" :else at$=at$+"." :endif
  216.                     if (at% and $2)   :at$=at$+"H" :else at$=at$+"." :endif
  217.                     if (at% and $4)   :at$=at$+"S" :else at$=at$+"." :endif
  218.                 endif
  219.                 r%=1
  220.                 if mtime%=2 or mdate%=2 or msize%=2 or mask$>""
  221.                     r%=checkf%:(dd&)
  222.                 endif
  223.                 if r%=1 and mat%=2 :r%=chkatt%: :endif
  224.                 if r%
  225.                     if srch%=2
  226.                         d$=replace$:(d$)
  227.                     endif
  228.                     if disset%=1
  229.                         dats$=left$(d$+rept$(" ",35),30)
  230.                     else
  231.                         dats$=left$(d$+rept$(" ",35),35)
  232.                     endif
  233.                     dats$=dats$+right$("      "+gen$(size&,7),7)+rept$(" ",space%)+right$("00"+gen$(std%,2),2)+":"+right$("00"+gen$(min%,2),2)+":"+right$("00"+gen$(sek%,2),2)
  234.                     dats$=dats$+rept$(" ",space%)+right$(gen$(j%,4),2)+"-"+right$("00"+gen$(mo%,2),2)+"-"+right$("00"+gen$(t%,2),2)
  235.                     if disset%=1 :rem full info
  236.                         dats$=dats$+" "+at$
  237.                     endif
  238.                     if disp%=1
  239.                         PRINT right$(""+dats$,60);
  240.                         if outp%=2
  241.                             rem to printer
  242.                             lprint dats$
  243.                         endif
  244.                         if outp%=3
  245.                             rem to file
  246.                             if disset%=1 :rem full output
  247.                                 lprint d$+chr$(9)+gen$(size&,7)+chr$(9)+ right$("00"+gen$(std%,2),2)+":"+right$("00"+gen$(min%,2),2)+":"+right$("00"+gen$(sek%,2),2)+chr$(9)+ right$(gen$(j%,4),2)+" "+right$("00"+gen$(mo%,2),2)+" "+right$("00"+gen$(t%,2),2)+chr$(9)+at$
  248.                             else
  249.                                 lprint d$+chr$(9)+gen$(size&,7)+chr$(9)+ right$("00"+gen$(std%,2),2)+":"+right$("00"+gen$(min%,2),2)+":"+right$("00"+gen$(sek%,2),2)+chr$(9)+ right$(gen$(j%,4),2)+" "+right$("00"+gen$(mo%,2),2)+" "+right$("00"+gen$(t%,2),2)
  250.                             endif
  251.                         endif
  252.                     endif
  253.                     sz&=sz&+size& :fcount%=fcount%+1
  254.                 endif
  255.             else
  256.                 z%=z%+1
  257.                 d$=d$+"\"
  258.                 di$(z%)=d$
  259.             endif
  260.             d$=DIR$("")
  261.         endwh
  262.     endwh
  263. busy off
  264. endif
  265. zz%=zz%+z%-1 :rem total number of dirs
  266. if all%=1
  267.     drive%=drive%+1
  268.     if drive%<4
  269.         goto loop::
  270.     else
  271.         drive%=2
  272.     endif
  273. endif
  274. :
  275. print zz%-1,"directories scanned"
  276. if fcount%=1
  277.     print "Found: ",fcount%,"file, ",sz&,"bytes"
  278. else
  279.     print "Found: ",fcount%,"files, ",sz&,"bytes"
  280. endif
  281. if outp%>1
  282.     lprint zz%-1,"directories scanned"
  283.     if fcount%=1
  284.         lprint "Found: ",fcount%,"file, ",sz&,"bytes"
  285.     else
  286.         lprint "Found: ",fcount%,"files, ",sz&,"bytes"
  287.     endif
  288.     lclose
  289.     if outp%=3
  290.         print
  291.         print "The following file has been generated: ";outf$
  292.     endif
  293. endif
  294. GET
  295. endp
  296.  
  297. proc checkf%:(d&)
  298. local r%,sec&
  299. r%=1
  300. if mdate%=2
  301.     if d&>=ddat1& and d&<=ddat2&
  302.     else
  303.         r%=0
  304.     endif
  305. endif
  306. if msize%=2
  307.     if size&>=dsize1& and size&<=dsize2&
  308.     else
  309.         r%=0
  310.     endif
  311. endif
  312. if mtime%=2
  313.     sec&=iabs(std%)*3600
  314.     sec&=sec&+min%*60+sek%
  315.     if sec&>=dtime1& and sec&<=dtime2&
  316.     else
  317.         r%=0
  318.     endif
  319. endif
  320. if loc(d$,mask$)
  321. else
  322.     r%=0
  323. endif
  324. return r%
  325. endp
  326.  
  327. proc chkatt%:
  328. local t$(4),r%
  329. r%=1
  330. if at%(1)=3 or at%(2)=3 or at%(3)=3 or at%(4)=3
  331.     if at%(1)=1 and mid$(at$,1,1)<>"." :r%=0 :endif
  332.     if at%(1)=2 and mid$(at$,1,1)<>"R" :r%=0 :endif
  333.     if at%(2)=1 and mid$(at$,2,1)<>"." :r%=0 :endif
  334.     if at%(2)=2 and mid$(at$,2,1)<>"M" :r%=0 :endif
  335.     if at%(3)=1 and mid$(at$,3,1)<>"." :r%=0 :endif
  336.     if at%(3)=2 and mid$(at$,3,1)<>"H" :r%=0 :endif
  337.     if at%(4)=1 and mid$(at$,4,1)<>"." :r%=0 :endif
  338.     if at%(4)=2 and mid$(at$,4,1)<>"S" :r%=0 :endif
  339. else
  340.     if at%(1)=2 :t$="R" :else t$="." :endif
  341.     if at%(2)=2 :t$=t$+"M" :else t$=t$+"." :endif
  342.     if at%(3)=2 :t$=t$+"H" :else t$=t$+"." :endif
  343.     if at%(4)=2 :t$=t$+"S" :else t$=t$+"." :endif
  344.     if at$<>t$ :r%=0 :endif
  345. endif
  346. return r%
  347. endp
  348.  
  349. proc prepare:
  350. rem for search & replace function
  351. local i%,j%,k%,c%,l%
  352. search$(1)=srch$(1)
  353. search$(2)=srch$(2)
  354. i%=0
  355. do
  356.     i%=i%+1
  357.     j%=1
  358.     do
  359.         l%=len(search$(i%))
  360.         if mid$(search$(i%),j%,1)="\"
  361.             if mid$(search$(i%),j%+1,1)="\"
  362.                 search$(i%)=left$(search$(i%),j%-1)+mid$(search$(i%),j%+1,20)
  363.             else
  364.                 c%=hex2dec%:(mid$(search$(i%),j%+1,2))
  365.                 search$(i%)=left$(search$(i%),j%-1)+chr$(c%)+mid$(search$(i%),j%+3,20)
  366.             endif
  367.         endif
  368.         j%=j%+1
  369.     until j%>l%-1
  370. until i%=2
  371. endp
  372.  
  373. proc hex2dec%:(s$)
  374. local i%,j%,n
  375. i%=len(s$)
  376. while(i%>0)
  377.     n=n+(loc("0123456789ABCDEF",mid$(s$,i%,1))-1)*16.0**j%
  378.     i%=i%-1
  379.     j%=j%+1
  380. endwh
  381. return intf(n+.5)
  382. endp
  383.  
  384. proc replace$:(s$)
  385. local t$(255),l%,ll%,m%
  386. t$=s$
  387. ll%=len(search$(1))
  388. l%=loc(t$,search$(1))
  389. if l%
  390.     t$=left$(t$,l%-1)+search$(2)+mid$(t$,l%+ll%,255)
  391. endif
  392. if replm%=2
  393.     do
  394.         m%=loc(mid$(t$,l%+ll%,255),search$(1))
  395.         if m%
  396.             l%=m%+l%+ll%-1
  397.             t$=left$(t$,l%-1)+search$(2)+mid$(t$,l%+ll%,255)
  398.         endif
  399.     until m%=0
  400. endif
  401. return t$
  402. endp
  403.  
  404. proc datecnv$:(a&,b&)
  405. local y%,m%,d%,x%,s$(23)
  406. secstodate (a&-25567)*3600*24,y%,m%,d%,x%,x%,x%,x%
  407. s$=gen$(y%,4)+"-"+right$("0"+gen$(m%,2),2)+"-"+right$("0"+gen$(d%,2),2)
  408. secstodate (b&-25567)*3600*24,y%,m%,d%,x%,x%,x%,x%
  409. s$=s$+" - "+gen$(y%,4)+"-"+right$("0"+gen$(m%,2),2)+"-"+right$("0"+gen$(d%,2),2)
  410. return s$
  411. endp
  412.  
  413.